package com.zy.集合.常用方法.集合计算高级函数

import scala.collection.mutable

object Test {

  def main(args: Array[String]): Unit = {

    val list1: List[Int] = List[Int](1, -2, 8, 3, -3)


    // 高级函数 泛用

    // 过滤
    println(list1.filter(_ > 0))

    // 转换/映射  对每一个元素进行转换，得到一个新的集合
    // 集合每个数*2
    println(list1.map(_ * 2))
    // 转换类型
    val result1: List[(String, Int)] = list1.map(a => {
      ("num", a)
    })
    println(result1)

    // 扁平化
    val list3: List[List[Int]] = List(List(1, 3, 5), List(-5, -3, -1))
    println(list3.flatten)

    // 扁平化 + 映射
    val list4: List[String] = List("Hello java", "Hello scala", "Hello spark", "Hello Hadoop")
    // 将字符串进行分词，并保存成字符串列表 先map拆分字符串，再flatten扁平化
    println(list4.flatMap(_.split(" ")))

    // 分组
    val list2: List[(String, Int)] = List[(String, Int)](("a", 2), ("a", 6), ("c", 1), ("d", 5))
    val groupBy: Map[String, List[(String, Int)]] = list2.groupBy(_._1)
    println(groupBy)

    println("================================")

    // 归约聚合 reduce
    // reduce 求和
    println(list1.reduce(_ + _))

    // fold 带状态的聚合  给定一个初始值，基于这个初始值做操作
    println(list1.fold(-100)(_ + _))

    println("=================================")

    // 合并两个map，以map1作为基准，map2规约到map1中
    val map1: mutable.Map[String, Int] = mutable.Map[String, Int]("a" -> 2, "b" -> 3, "c" -> 5)
    val map2: mutable.Map[String, Int] = mutable.Map[String, Int]("a" -> 4, "c" -> 2, "d" -> 1)
    // foldLeft 两个元素可以不同
    map2.foldLeft(map1)((map, kv) => {
      map.put(kv._1, map.getOrElse(kv._1, 0) + kv._2)
      map
    })
    println(map1)




  }
}
